0x00 前言
这段时间把whaleCTF的密码学部分进行了收尾,完成了部分题目,仍剩下一题亟待解决.
0x01 解题记录
Death_Chain 100
题目: 某天,夏多抛出了一张纸条.满是圆圈的纸条应该有所隐藏信息,你能够发现吗?
答案格式: flag{xxxx},xxx是所有的解密内容,大写
知识点: 夏多密码
解题记录: 根据提示搜索“夏多密码”,可以得到如图所示的密码表.
把所给的密文与密码表进行对照,可以得到flag.
先有什么 100
题目: 这是个值得思考的问题,到底先有什么——UFO?麦田怪圈?答案格式: key{flag},flag是解密内容.
知识点: 键盘密码
解题记录: 键盘密码,将所给的字母在键盘上连起来,找到每一部分中间所包围的字母即可.
检查符号 100
题目: 截取一段电波,一不小心全变成了泡泡.你能够解密吗? “o00。o。o0oo。0o0o。000。00。o。0。000。ooo0。o。0o。oo0。ooo。0o0o。0。oo0o” 答案格式: key{flag},flag是解密内容.
知识点: 摩斯电码
解题记录: 打开txt文件发现有数字0,句号和字母o构成,猜想是摩斯电码.写一个脚本解密.
1 | def mouse(a): |
德军密码 100
题目: 二战时盟军截获德军一段密码,密文为: 000001100000000010101011011100101
1000101100000111001100100111100111001(密钥: helloworld),你可能会解出一个keyxxxxx的答案,请在y后面加{,结尾加},答案的格式是key{xxxxx},所以答案是
知识点: 费纳姆密码
解题记录: 打开题目后发现key以及一长串二进制数字,结合所给提示德军密码,可知是费纳姆编码,写个脚本跑一下.
1 | transform1 = {'1000001':'A','1000010':'B', |
这里介绍几个知识点:
- 构建字母转换成二进制的字典的时候,不需要重新构建,只需要将原来字典的key和value互换位置.
transform2 = {value:key for key,value in transform1.items()}
01字符串分组处理时,可以使用索引加7的方法进行处理.
1
2
3
4
5
6
7
8
9
10def trans2(cipher):
num = 0
result = []
plain = ''
while True:
result.append(cipher[num:num+7])
num += 7
if(num > len(cipher)-7):
break
return result
注意最后得到的数组中有字典中没有的key,我们使用空格来进行代替,最后将空格手动替换成花括号即可.
密钥生成 100
题目: 在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17求解出d,格式: key{xxxx}
知识点: rsa中d的生成
解题记录: 已知p,q,e,使用模反求d的方法求出来d即可.
规则很公平 150
题目: vv公司称,他们给出了最为公平的游戏规则,你能猜到是什么吗?规则: CGOCPMOFEBMLUNISEOZY,附件: CULTREABDFGHIKMNOPQSVWXYZ. 答案的格式是key{xxxxx},所以答案是.
知识点: 波雷菲尔密码
解题记录: 由“公平”联想到英文“fair”,从而联想到playfair密码.我们使用造好的轮子即pycipher库中的Playfair函数来进行操作.
1 | from pycipher import Playfair |
将得到的结果进行适当删减即可获得flag.
数学小问题 150
题目: 小小的数学问题,你能搞定吗?SElWTVVSQ1FXUUlXVUhFVg, 答案的格式是key{xxxxx},所以答案是
知识点: base64+仿射密码
解题记录: 首先根据图片提示得知为仿射密码,先写了一个脚本,但跑出来发现结果没有有意义的明文,便卡了一段时间.
后来仔细观察密文,发现类似base64的形式,遂在其后加上==进行base解密,将得到的密文再跑仿射脚本,可以得到有意义的结果.
1 | import base64 |
此处应写 150
记录一下该问题的复杂版,即CTF-30days的填空题.
题目: 拿到一个填空题,到底该填什么?答案的格式是key{xxxxx},所以答案是
知识点: utf-9编码+字符匹配
该题目下载得到的文件名为: flag is here rfc4042,无法通过文本编辑等打开.百度查找rfc4042,发现该文件可能使用了utf-9编码.
解题记录: 写一个脚本进行译码.
1 | import utf9 |
将得到的结果中的下划线数量转换成数字,其他符号不变.
1 | cipher = '_____*((__//__+___+______-____%____)**((___%(___-_))+________+(___%___+_____+_______%__+______-(______//(_____%___)))))+__*(((________/__)+___%__+_______-(________//____))**(_*(_____+_____)+_______+_________%___))+________*(((_________//__+________%__)+(_______-_))**((___+_______)+_________-(______//__)))+_______*((___+_________-(______//___-_______%__%_))**(_____+_____+_____))+__*(__+_________-(___//___-_________%_____%__))**(_________-____+_______)+(___+_______)**(________%___%__+_____+______)+(_____-__)*((____//____-_____%____%_)+_________)**(_____-(_______//_______+_________%___)+______)+(_____+(_________%_______)*__+_)**_________+_______*(((_________%_______)*__+_______-(________//________))**_______)+(________/__)*(((____-_+_______)*(______+____))**___)+___*((__+_________-_)**_____)+___*(((___+_______-______/___+__-_________%_____%__)*(___-_+________/__+_________%_____))**__)+(_//_)*(((________%___%__+_____+_____)%______)+_______-_)**___+_____*((______/(_____%___))+_______)*((_________%_______)*__+_____+_)+___//___+_________+_________/___' |
将运算后的结果转换成十六进制然后两个一组转换成字符即可.
1 | key = 5287002131074331513 |
栅栏加密 150
题目: 我家篱笆旁的栅栏被捣乱了!第一根和第二根都被换了位置…只有第三根还能站在那,缺也短了一截了.变成了这样: udJZml2VYVuWkdxXXs2Ne1DV5V9XEs2ZdZ7WlSNbVrm9eNDSlaFXG91F谁能帮我修好呢?flag格式: venusCTF{xxx}
知识点: 栅栏密码
解题记录: 按照要求写出来即可.
小明入侵 150
题目: 小明入侵网站后获得了管理员的密文,由于太高兴了手一抖把密文删除了一部分,只剩下前10位a74be8e20b,小明根据社工知道管理员的密码习惯是key{4位的数字或字母},所以管理员的密码是.
知识点: md5解密
解题记录: 查找可知一般的网站管理员的登录密文是经过md5和sha1加密,因为只有四位,故可以使用脚本进行解题.注意构造的字典需要包含大小写字母和数字.
1 | import hashlib |
RSA破解 200
题目: 得到了公钥,怎么才能解密呢?
tip分解n,答案格式ISG{flag}
知识点: openssl的使用,n的分解
解题记录: 打开解压后的文件,发现证书和加密后的文件.使用openssl提取n.
1 | openssl rsa -pubin -text -modulus -in warmup -in pem证书的路径 |
得到下图所示的n.
得到的n显然是十六进制,所以将其转换成十进制,尽量不要使用在线进制转换.随后使用在线网站(在线大数分解)进行解密,得到p和q,然后使用rsatool.py脚本及openssl配合(同一目录)得到flag.
1 | python rsatool.py -o private.pem -e e的值 -p p的值 -q q的值 |
得到私钥之后使用openssl进行解密.
1 | openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt |
RSA分解 200
题目: 某安全公司通过网络监听截取了某间谍连续发送的一段明文和公钥,你能够解密传输内容吗?
知识点: rsa已知密文和公钥进行解密
解题记录: 已知n和e公钥对,首先将n进行分解,再求出来d,使用解密脚本解密即可.
1 | p = 18443 |
将得到的结果进行ascii转码,得到字符串.
只有密文 200
题目: 怎么办,已经截获了密文和模数n!能够破解吗?请分解出RSA中的两个大素数q和p.提交格式是key{x}x为两个素数中较小的那个的MD5前8位.
知识点: 唯密文攻击.
rsa中只提供密文和n的时候,可以先求出来每一组密文和n的最大公约数,找出来非1的公约数,该数字即为p或者q,再结合n求出来p或q,即可还原整个加密过程.
解题记录: 根据唯密文攻击的原理,编辑脚本进行计算.
1 | import hashlib |
RSA专家
题目: 得到了私钥,破解还不简单吗?
格式: key{xxx}
知识点: openssl的使用
解题记录: zip解压的到aaaa和endata,直接openssl解密.
1 | openssl rsautl -decrypt -in endata -inkey aaaa -out flag.txt |
0x03 others
whale的密码题还有一道”大家来解密”没有完成,给出了key和iv猜想是aes系列.”算法问题”的flag就在所给脚本中,没有什么价值.